<?php

use \think\Request;
use \think\Config;
use think\Db;


/**
 * 加载测试数据库
 */
function config_test_database()
{
    Config::load(__DIR__ . "/test_database.php");
}

/**
 * 加载生产数据库
 */
function config_database()
{
    Config::load(__DIR__ . "/database.php");
}


//必要的参数
/**
 * @param $data
 * @param $key
 * @return mixed
 */
function essential_param($data, $key)
{
    if (array_key_exists($key, $data))
    {
        return $data[$key];
    }
    else
    {
        send_developer_error("必选字段【".$key."】不存在,请核实文档后重试!");
    }
}

/**
 * 获取当前用户
 *
 * @return \app\api\model\User
 */
function current_user()
{
    return \app\api\model\User::instance();
}

/**********************************************JSON与XML互转****************************************/

/**
 * 将JSON字符串转为XML字符串
 *
 * @param $json                         待转换的JSON字符串
 * @param string $tag                   XML外层标签,用于封装数据
 * @param string $charset               转换后的XML字符集
 * @return bool|void                    如果字符串为空则返回false;否则返回转换后的XML字符串
 */
function json_to_xml($json, $tag = "array", $charset = 'utf8')
{
    if(empty($json))
    {
        return false;
    }

    //将JSON字符串解析为数组
    $array = json_decode($json);

    return array_to_xml($array, $tag, $charset);
}

/**
 * 将数组转为XML字符串
 *
 * @param $array                        待转换的数组数据
 * @param string $tag                   XML外层标签,用于封装数据
 * @param string $charset               转换后的XML字符集
 * @return bool|string                  如果字符串为空则返回false;否则返回转换后的XML字符串
 */
function array_to_xml($array, $tag = "array", $charset = "utf8")
{
    //判断数组是否为空
    if (empty($array))
    {
        return false;
    }

    $array = array(
        "$tag" => $array,
    );

    //XML头
    $xml = "<?xml version=\"1.0\" encoding=\"" . $charset . "\"?>";

    $xml .= array_to_xml_without_head($array, $tag);

    return $xml;
}

/**
 * 将数组转为XML体(不携带XML头信息)
 *
 * @param $array                        待转换的数组
 * @return string                       转换后的XML字符串
 */
function array_to_xml_without_head($array, $parentKey)
{
    $string="";
    foreach($array as $key => $value)
    {
        if (is_numeric($key))
        {
            if ($key > 0)
            {
                $string .= "<" . $parentKey . ">";
            }
        }
        else
        {
            $string .= "<" . $key . ">";
        }


        //判断值是对象还是数组
        if(is_array($value) || is_object($value))
        {
            //是数组或者对象进行递归调用
            $string .= array_to_xml_without_head($value, $key);
        }
        //取得标签数据
        else
        {
            $string .= $value;
        }

        if (is_numeric($key))
        {
            if ($key < count($array) - 1)
            {
                $string .= "</" . $parentKey . ">";
            }
        }
        else
        {
            $string .= "</" . $key . ">";
        }
    }
    return $string;
}

/**
 * 将XML字符串转为数组
 *
 * @param $xml                          待转换的XML字符串
 * @return mixed                        转换后的数组
 */
function xml_to_array($xml)
{
    return json_decode(xml_to_json($xml), true);
}

/**
 * 将XML字符串转为JSON字符串
 *
 * @param $xml                          待转换的XML字符串
 * @return string                       转换后的JSON字符串
 */
function xml_to_json($xml)
{
    return json_encode(simplexml_load_string($xml));
}

/**
 * 根据手机号生成验证码
 *
 * @param $mobile
 * @return array|false|int|PDOStatement|string|\think\Model
 */
function generate_captcha($mobile)
{
    //判断是否存在验证码
    $captcha = Db::name("captcha")
        ->where("mobile", $mobile)
        ->find();

    if (empty($captcha))
    {
        //生成验证码
        $captcha = rand(100000, 999999);

        //发送短信验证码
        return $captcha;
    }
    else if ($captcha["due_time"] < time())
    {
        //删除原有验证码
        Db::name("captcha")->where("mobile", $mobile)->delete();

        //生成验证码
        $captcha = rand(100000, 999999);

        return $captcha;
    }
    else
    {
        send_user_error("验证码有效期为10分钟,请查看手机短信!");
    }
}

/**
 * 发送短信验证码
 *
 * @param $mobile                       目标手机号
 * @param $captcha                      验证码
 * @return bool
 */
function send_captcha($mobile, $captcha)
{
    //导入所需库文件
    import('alidayu.TopSDK', EXTEND_PATH, ".php");
    import('alidayu.top.TopClient', EXTEND_PATH, ".php");
    import('alidayu.top.ResultSet', EXTEND_PATH, ".php");
    import('alidayu.top.RequestCheckUtil', EXTEND_PATH, ".php");
    import('alidayu.top.TopLogger', EXTEND_PATH, ".php");
    import('alidayu.top.request.AlibabaAliqinFcSmsNumSendRequest', EXTEND_PATH, ".php");

    //创建客户端
    $client = new \TopClient;
    $client->appkey = "23518309";
    $client->secretKey = "50502f2d739339f69ae4b073ab02d921";

    //创建请求
    $request = new \AlibabaAliqinFcSmsNumSendRequest;
    $request->setExtend("");
    $request->setSmsType("normal");
    $request->setSmsFreeSignName("顺和福利盈");
    $request->setSmsParam("{'code':'" . $captcha . "'}");
    $request->setRecNum($mobile);
    $request->setSmsTemplateCode("SMS_25405201");

    //回执报文
    $response = $client->execute($request);

    //判断发送结果
    if (array_key_exists("result", $response))
    {
        //在数据库中存储验证码
        $data = array(
            "mobile" => $mobile,
            "captcha" => md5($captcha),
            "create_time" => time(),
            "due_time" => time() + 10 * 60,
        );

        Db::name("captcha")->insert($data);

        return true;
    }
    else
    {
        send_server_error($response->msg);
    }
}

/**
 * 验证短信验证码是否正确
 *
 * @param $mobile                   待验证的手机号
 * @param $captcha                  待验证的验证码
 * @return bool                     验证成功则返回true;否则向APP端发送异常报文
 */
function verify_captcha($mobile, $captcha)
{
    //获取验证码
    $captchaRecord = Db::name("captcha")
        ->where("mobile", $mobile)
        ->find();

    //验证码不存在
    if (empty($captchaRecord))
    {
        send_developer_error("尚未发送短信验证码,请重新发送!");
    }
    //验证码过期
    elseif ($captchaRecord["due_time"] < time())
    {
        //删除存储的验证码
        Db::name("captcha")->where("mobile", $mobile)->delete();

        send_user_error("短信验证码已过期,请重新发送!");
    }
    //验证码错误
    elseif ($captchaRecord["captcha"] != md5($captcha))
    {
        send_user_error("短信验证码错误,请查看手机短信后重试!");
    }
    else
    {
        //删除存储的验证码
        Db::name("captcha")->where("mobile", $mobile)->delete();

        return true;
    }
}

/**
 * 生成随机ID
 *
 * @return string                       生成的ID
 */
function generate_random_id()
{
    //抽奖码
    $baseChar = '123456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
    $bit = 8;
    $id = '';
    for($i = 0; $i < $bit; $i++)
    {
        $rand = rand(0, strlen($baseChar) - 1);
        $id .= $baseChar[$rand];
    }

    return $id;
}

/**
 * 翻译字符串
 *
 * @param string $message 待翻译的文本
 * @return mixed
 */
function translate($message)
{
    return mo_translate($message, "api");
}
